iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
自我挑戰組

Ruby OOP to Oops !n 30系列 第 16

IT 邦鐵人賽 Day 16 - Bridge

  • 分享至 

  • xImage
  •  

橋接模式(Bridge)

目的:

將實作體系與抽象體系分離開來,讓兩者能各自更動各自演進。

結構:

https://ithelp.ithome.com.tw/upload/images/20221001/20151094A7ArLEX6MQ.png

情境

建立多個餐廳,而每間餐廳內還有雞肉類套餐
利用繼承設計模式
https://ithelp.ithome.com.tw/upload/images/20221001/201510943H21KqwNJt.png

若是以後再增加更多不同餐廳或者不同食物,就又需要增加更多的繼承關係

改善方法

利用組合來代替繼承-橋接模式(Bridge)
https://ithelp.ithome.com.tw/upload/images/20221001/20151094ghPNy5ipUA.png

實作

class Restaurant
  def initialize(food)
    @food = food
  end

  def order
    "任一餐廳:\n"\
    "#{@food.make}"
  end
end

class McDonald < Restaurant
  def order
    "麥當勞:\n"\
    "#{@food.make}"
  end
end

class KFC < Restaurant
  def order
    "肯德基:\n"\
    "#{@food.make}"
  end
end

class Napoli < Restaurant
  def order
    "拿坡里:\n"\
    "#{@food.make}"
  end
end

class Chicken
  def make
    raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
  end
end

class ChickenThigh < Chicken
  def make
    '雞腿'
  end
end

class ChickenWing < Chicken
  def make
    '雞翅'
  end
end

class ChickenBreast < Chicken
  def make
    '雞胸'
  end
end

def client(abstraction)
  print abstraction.order
end

c_b = ChickenBreast.new 
r_b = Restaurant.new(c_b)
client(r_b) #任一餐廳:雞胸

puts "\n\n"

c_t = ChickenThigh.new 
m_t = McDonald.new(c_t)
client(m_t) #麥當勞:雞腿

解釋

在這設計模式中,首先找出變化部分並且額外封裝。此外將這些關係利用物件聚合,而非類別繼承
而使用物件聚合的目的在於能夠使互相獨立的類別中,包含變化,使未來在新增時,不會影響原本的程式碼

文章不定期更新!

感謝大家 如有問題,再煩請大家指教!


上一篇
IT 邦鐵人賽 Day 15 - Adapter
下一篇
IT 邦鐵人賽 Day 17 - Composite
系列文
Ruby OOP to Oops !n 3020
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Jean_HSU
iT邦新手 5 級 ‧ 2022-10-03 22:02:48

喳喳

我要留言

立即登入留言